package com.gxc.linkedList;

/**
 * 给定一个有序数组arr，代表数轴上从左到右有n个点arr[0]、arr[1]...arr[n-1],
 * 给定一个正数L，代表一根长度为L的绳子，求绳子最多能覆盖其中的几个点。
 */
public class SlidingWindow2 {

    public static void main(String[] args) {
        //                    0 1 2 3 4  5  6
        int[] arr = new int[]{1,4,5,7,8,11,15};
        int L = 3;

        int most = getMostPoint(arr, L);
        System.out.println(most);
    }

    /**
     * 双指针做滑动窗口
     * @param arr
     * @param L
     * @return
     */
    private static int getMostPoint(int[] arr, int L ) {
        if (arr == null || arr.length ==0) return 0;

        int l = 0;
        int r = 0;
        //最大覆盖的点数量
        int maxPoint = Integer.MIN_VALUE;
        int point = 0;
        //左指针与数组下标对其
        for (int i = 0; i < arr.length; i++) {
            l = i;
            //当窗口大小小于等于绳子长度，右指针一直往右滑动
            while (r<arr.length && arr[r]-arr[l]<=L) {
                r++;
            }
            //当窗口大小大于绳子长度，左右指针间隔就是覆盖的点的数量
            point = r-l;
            maxPoint = Math.max(maxPoint, point);
        }
        return maxPoint;
    }

}
